{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "uuid": "9b6358d5-247c-46c6-8287-efbb3b848b31"
   },
   "outputs": [],
   "source": [
    "# !pip install pandas==0.24.2 --user\n",
    "# !pip install lightgbm==2.3.1 --user\n",
    "# !pip install xgboost==1.1.1 --user"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "uuid": "6cb8b3d7-a557-41a5-809a-373bc3d4877c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fri Jun 20 20:38:40 2025       \n",
      "+-----------------------------------------------------------------------------------------+\n",
      "| NVIDIA-SMI 566.07                 Driver Version: 566.07         CUDA Version: 12.7     |\n",
      "|-----------------------------------------+------------------------+----------------------+\n",
      "| GPU  Name                  Driver-Model | Bus-Id          Disp.A | Volatile Uncorr. ECC |\n",
      "| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |\n",
      "|                                         |                        |               MIG M. |\n",
      "|=========================================+========================+======================|\n",
      "|   0  NVIDIA GeForce RTX 3050 ...  WDDM  |   00000000:01:00.0  On |                  N/A |\n",
      "| N/A   58C    P8              7W /   90W |    1238MiB /   4096MiB |      9%      Default |\n",
      "|                                         |                        |                  N/A |\n",
      "+-----------------------------------------+------------------------+----------------------+\n",
      "                                                                                         \n",
      "+-----------------------------------------------------------------------------------------+\n",
      "| Processes:                                                                              |\n",
      "|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |\n",
      "|        ID   ID                                                               Usage      |\n",
      "|=========================================================================================|\n",
      "|    0   N/A  N/A      3868    C+G   ...2txyewy\\StartMenuExperienceHost.exe      N/A      |\n",
      "|    0   N/A  N/A      8428    C+G   D:\\Microsoft VS Code\\Code.exe               N/A      |\n",
      "|    0   N/A  N/A      9396    C+G   D:\\douyin\\douyin.exe                        N/A      |\n",
      "|    0   N/A  N/A     10196    C+G   ...Office\\12.1.0.21541\\office6\\wpp.exe      N/A      |\n",
      "|    0   N/A  N/A     12776    C+G   D:\\QQNT\\QQ.exe                              N/A      |\n",
      "|    0   N/A  N/A     12932    C+G   ...on\\137.0.3296.83\\msedgewebview2.exe      N/A      |\n",
      "|    0   N/A  N/A     16328    C+G   ...CBS_cw5n1h2txyewy\\TextInputHost.exe      N/A      |\n",
      "|    0   N/A  N/A     18200    C+G   ...9\\extracted\\runtime\\WeChatAppEx.exe      N/A      |\n",
      "|    0   N/A  N/A     18700    C+G   ...crosoft\\Edge\\Application\\msedge.exe      N/A      |\n",
      "|    0   N/A  N/A     22668    C+G   ...siveControlPanel\\SystemSettings.exe      N/A      |\n",
      "|    0   N/A  N/A     22892    C+G   ...crosoft\\Edge\\Application\\msedge.exe      N/A      |\n",
      "|    0   N/A  N/A     23396    C+G   C:\\Windows\\explorer.exe                     N/A      |\n",
      "|    0   N/A  N/A     25332    C+G   ...\\cef\\cef.win7x64\\steamwebhelper.exe      N/A      |\n",
      "|    0   N/A  N/A     25828    C+G   ...5n1h2txyewy\\ShellExperienceHost.exe      N/A      |\n",
      "|    0   N/A  N/A     29016    C+G   ....5688.0_x64__8j3eq9eme6ctt\\IGCC.exe      N/A      |\n",
      "|    0   N/A  N/A     32416    C+G   C:\\Windows\\explorer.exe                     N/A      |\n",
      "|    0   N/A  N/A     34756    C+G   ...1541\\office6\\promecefpluginhost.exe      N/A      |\n",
      "|    0   N/A  N/A     37352    C+G   ...nt.CBS_cw5n1h2txyewy\\SearchHost.exe      N/A      |\n",
      "|    0   N/A  N/A     37592    C+G   C:\\Windows\\explorer.exe                     N/A      |\n",
      "|    0   N/A  N/A     40424    C+G   ...4__8wekyb3d8bbwe\\EdgeGameAssist.exe      N/A      |\n",
      "|    0   N/A  N/A     45420    C+G   ...ṷ\\KGMusic\\20.0.32.27110\\KuGou.exe      N/A      |\n",
      "+-----------------------------------------------------------------------------------------+\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'2.3.0'"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "!nvidia-smi\n",
    "import numpy as np\n",
    "np.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    },
    "uuid": "70fa3a9f-826c-4af9-9c28-a320fd3261fa"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "06-20\n",
      "读取数据...\n",
      "train.shape (800000, 47)\n",
      "test.shape (200000, 46)\n",
      "初始拼接后： (1000000, 47)\n",
      "n特征处理后： (1000000, 53)\n",
      "count编码后： (1000000, 61)\n",
      "1data.shape (1000000, 53)\n",
      "2_data.shape (1000000, 57)\n",
      "预处理完毕 (1000000, 58)\n",
      "开始特征工程...\n",
      "data.shape (1000000, 74)\n",
      "开始模型训练...\n",
      "num0:mean_encode train.shape (800000, 84) (200000, 84)\n",
      "num1:target_encode train.shape (800000, 89) (200000, 89)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 5/5 [00:20<00:00,  4.10s/it]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "num2:target_encode train.shape (800000, 109) (200000, 109)\n",
      "输入数据维度： (800000, 104) (200000, 104)\n",
      "Current num of features: 102\n",
      "[0]\ttrain-auc:0.71522\teval-auc:0.70785\n",
      "Multiple eval metrics have been passed: 'eval-auc' will be used for early stopping.\n",
      "\n",
      "Will train until eval-auc hasn't improved in 600 rounds.\n",
      "[100]\ttrain-auc:0.73580\teval-auc:0.72415\n",
      "[200]\ttrain-auc:0.74173\teval-auc:0.72734\n",
      "[300]\ttrain-auc:0.74747\teval-auc:0.73014\n",
      "[400]\ttrain-auc:0.75300\teval-auc:0.73266\n",
      "[500]\ttrain-auc:0.75792\teval-auc:0.73453\n",
      "[600]\ttrain-auc:0.76213\teval-auc:0.73576\n",
      "[700]\ttrain-auc:0.76597\teval-auc:0.73660\n",
      "[800]\ttrain-auc:0.76942\teval-auc:0.73728\n",
      "[900]\ttrain-auc:0.77270\teval-auc:0.73779\n",
      "[1000]\ttrain-auc:0.77590\teval-auc:0.73824\n",
      "[1100]\ttrain-auc:0.77891\teval-auc:0.73857\n",
      "[1200]\ttrain-auc:0.78166\teval-auc:0.73888\n",
      "[1300]\ttrain-auc:0.78448\teval-auc:0.73914\n",
      "[1400]\ttrain-auc:0.78704\teval-auc:0.73933\n",
      "[1500]\ttrain-auc:0.78953\teval-auc:0.73951\n",
      "[1600]\ttrain-auc:0.79213\teval-auc:0.73969\n",
      "[1700]\ttrain-auc:0.79471\teval-auc:0.73983\n",
      "[1800]\ttrain-auc:0.79710\teval-auc:0.74001\n",
      "[1900]\ttrain-auc:0.79944\teval-auc:0.74014\n",
      "[2000]\ttrain-auc:0.80175\teval-auc:0.74024\n",
      "[2100]\ttrain-auc:0.80400\teval-auc:0.74031\n",
      "[2200]\ttrain-auc:0.80622\teval-auc:0.74036\n",
      "[2300]\ttrain-auc:0.80846\teval-auc:0.74040\n",
      "[2400]\ttrain-auc:0.81060\teval-auc:0.74048\n",
      "[2500]\ttrain-auc:0.81275\teval-auc:0.74053\n",
      "[2600]\ttrain-auc:0.81483\teval-auc:0.74058\n",
      "[2700]\ttrain-auc:0.81689\teval-auc:0.74065\n",
      "[2800]\ttrain-auc:0.81907\teval-auc:0.74071\n",
      "[2900]\ttrain-auc:0.82120\teval-auc:0.74077\n",
      "[3000]\ttrain-auc:0.82330\teval-auc:0.74080\n",
      "[3100]\ttrain-auc:0.82519\teval-auc:0.74084\n",
      "[3200]\ttrain-auc:0.82718\teval-auc:0.74088\n",
      "[3300]\ttrain-auc:0.82922\teval-auc:0.74090\n",
      "[3400]\ttrain-auc:0.83120\teval-auc:0.74092\n",
      "[3500]\ttrain-auc:0.83320\teval-auc:0.74094\n",
      "[3600]\ttrain-auc:0.83500\teval-auc:0.74098\n",
      "[3700]\ttrain-auc:0.83699\teval-auc:0.74098\n",
      "[3800]\ttrain-auc:0.83885\teval-auc:0.74096\n",
      "[3900]\ttrain-auc:0.84074\teval-auc:0.74097\n",
      "[4000]\ttrain-auc:0.84259\teval-auc:0.74099\n",
      "[4100]\ttrain-auc:0.84441\teval-auc:0.74101\n",
      "[4200]\ttrain-auc:0.84627\teval-auc:0.74100\n",
      "[4300]\ttrain-auc:0.84800\teval-auc:0.74102\n",
      "[4400]\ttrain-auc:0.84984\teval-auc:0.74101\n",
      "[4500]\ttrain-auc:0.85153\teval-auc:0.74102\n",
      "[4600]\ttrain-auc:0.85328\teval-auc:0.74100\n",
      "[4700]\ttrain-auc:0.85510\teval-auc:0.74101\n",
      "[4800]\ttrain-auc:0.85681\teval-auc:0.74102\n",
      "[4900]\ttrain-auc:0.85852\teval-auc:0.74102\n",
      "[5000]\ttrain-auc:0.86019\teval-auc:0.74100\n",
      "[5100]\ttrain-auc:0.86186\teval-auc:0.74099\n",
      "[5200]\ttrain-auc:0.86343\teval-auc:0.74097\n",
      "[5300]\ttrain-auc:0.86512\teval-auc:0.74095\n",
      "[5400]\ttrain-auc:0.86679\teval-auc:0.74092\n",
      "[5500]\ttrain-auc:0.86835\teval-auc:0.74091\n",
      "Stopping. Best iteration:\n",
      "[4910]\ttrain-auc:0.85870\teval-auc:0.74103\n",
      "\n",
      "train_auc:0.8586967857282173,valid_auc0.7410306112419969\n",
      "[0.7410306112419969]\n",
      "[0]\ttrain-auc:0.71506\teval-auc:0.71004\n",
      "Multiple eval metrics have been passed: 'eval-auc' will be used for early stopping.\n",
      "\n",
      "Will train until eval-auc hasn't improved in 600 rounds.\n",
      "[100]\ttrain-auc:0.73564\teval-auc:0.72491\n",
      "[200]\ttrain-auc:0.74156\teval-auc:0.72821\n",
      "[300]\ttrain-auc:0.74732\teval-auc:0.73115\n",
      "[400]\ttrain-auc:0.75289\teval-auc:0.73354\n",
      "[500]\ttrain-auc:0.75789\teval-auc:0.73544\n",
      "[600]\ttrain-auc:0.76219\teval-auc:0.73674\n",
      "[700]\ttrain-auc:0.76609\teval-auc:0.73769\n",
      "[800]\ttrain-auc:0.76957\teval-auc:0.73842\n",
      "[900]\ttrain-auc:0.77298\teval-auc:0.73898\n",
      "[1000]\ttrain-auc:0.77628\teval-auc:0.73947\n",
      "[1100]\ttrain-auc:0.77946\teval-auc:0.73986\n",
      "[1200]\ttrain-auc:0.78238\teval-auc:0.74016\n",
      "[1300]\ttrain-auc:0.78518\teval-auc:0.74043\n",
      "[1400]\ttrain-auc:0.78779\teval-auc:0.74066\n",
      "[1500]\ttrain-auc:0.79036\teval-auc:0.74083\n",
      "[1600]\ttrain-auc:0.79280\teval-auc:0.74099\n",
      "[1700]\ttrain-auc:0.79530\teval-auc:0.74114\n",
      "[1800]\ttrain-auc:0.79784\teval-auc:0.74130\n",
      "[1900]\ttrain-auc:0.80019\teval-auc:0.74142\n",
      "[2000]\ttrain-auc:0.80261\teval-auc:0.74156\n",
      "[2100]\ttrain-auc:0.80487\teval-auc:0.74163\n",
      "[2200]\ttrain-auc:0.80702\teval-auc:0.74169\n",
      "[2300]\ttrain-auc:0.80925\teval-auc:0.74177\n",
      "[2400]\ttrain-auc:0.81141\teval-auc:0.74182\n",
      "[2500]\ttrain-auc:0.81349\teval-auc:0.74187\n",
      "[2600]\ttrain-auc:0.81566\teval-auc:0.74190\n",
      "[2700]\ttrain-auc:0.81775\teval-auc:0.74194\n",
      "[2800]\ttrain-auc:0.81971\teval-auc:0.74195\n",
      "[2900]\ttrain-auc:0.82172\teval-auc:0.74196\n",
      "[3000]\ttrain-auc:0.82358\teval-auc:0.74198\n",
      "[3100]\ttrain-auc:0.82563\teval-auc:0.74201\n",
      "[3200]\ttrain-auc:0.82773\teval-auc:0.74205\n",
      "[3300]\ttrain-auc:0.82966\teval-auc:0.74206\n",
      "[3400]\ttrain-auc:0.83163\teval-auc:0.74212\n",
      "[3500]\ttrain-auc:0.83363\teval-auc:0.74213\n",
      "[3600]\ttrain-auc:0.83546\teval-auc:0.74214\n",
      "[3700]\ttrain-auc:0.83739\teval-auc:0.74215\n",
      "[3800]\ttrain-auc:0.83935\teval-auc:0.74214\n",
      "[3900]\ttrain-auc:0.84128\teval-auc:0.74214\n",
      "[4000]\ttrain-auc:0.84310\teval-auc:0.74215\n",
      "[4100]\ttrain-auc:0.84490\teval-auc:0.74214\n",
      "Stopping. Best iteration:\n",
      "[3558]\ttrain-auc:0.83472\teval-auc:0.74216\n",
      "\n",
      "train_auc:0.8347229487811019,valid_auc0.7421619959324036\n",
      "[0.7410306112419969, 0.7421619959324036]\n",
      "[0]\ttrain-auc:0.71535\teval-auc:0.70793\n",
      "Multiple eval metrics have been passed: 'eval-auc' will be used for early stopping.\n",
      "\n",
      "Will train until eval-auc hasn't improved in 600 rounds.\n",
      "[100]\ttrain-auc:0.73586\teval-auc:0.72455\n",
      "[200]\ttrain-auc:0.74190\teval-auc:0.72759\n",
      "[300]\ttrain-auc:0.74768\teval-auc:0.73036\n",
      "[400]\ttrain-auc:0.75317\teval-auc:0.73269\n",
      "[500]\ttrain-auc:0.75816\teval-auc:0.73450\n",
      "[600]\ttrain-auc:0.76235\teval-auc:0.73572\n",
      "[700]\ttrain-auc:0.76625\teval-auc:0.73657\n",
      "[800]\ttrain-auc:0.76963\teval-auc:0.73718\n",
      "[900]\ttrain-auc:0.77304\teval-auc:0.73771\n",
      "[1000]\ttrain-auc:0.77615\teval-auc:0.73811\n",
      "[1100]\ttrain-auc:0.77912\teval-auc:0.73841\n",
      "[1200]\ttrain-auc:0.78191\teval-auc:0.73869\n",
      "[1300]\ttrain-auc:0.78461\teval-auc:0.73893\n",
      "[1400]\ttrain-auc:0.78723\teval-auc:0.73911\n",
      "[1500]\ttrain-auc:0.78982\teval-auc:0.73925\n",
      "[1600]\ttrain-auc:0.79227\teval-auc:0.73940\n",
      "[1700]\ttrain-auc:0.79480\teval-auc:0.73957\n",
      "[1800]\ttrain-auc:0.79707\teval-auc:0.73968\n",
      "[1900]\ttrain-auc:0.79939\teval-auc:0.73976\n",
      "[2000]\ttrain-auc:0.80171\teval-auc:0.73986\n",
      "[2100]\ttrain-auc:0.80388\teval-auc:0.73997\n",
      "[2200]\ttrain-auc:0.80612\teval-auc:0.74005\n",
      "[2300]\ttrain-auc:0.80827\teval-auc:0.74013\n",
      "[2400]\ttrain-auc:0.81047\teval-auc:0.74020\n",
      "[2500]\ttrain-auc:0.81269\teval-auc:0.74023\n",
      "[2600]\ttrain-auc:0.81488\teval-auc:0.74028\n",
      "[2700]\ttrain-auc:0.81692\teval-auc:0.74030\n",
      "[2800]\ttrain-auc:0.81907\teval-auc:0.74035\n",
      "[2900]\ttrain-auc:0.82108\teval-auc:0.74034\n",
      "[3000]\ttrain-auc:0.82310\teval-auc:0.74038\n",
      "[3100]\ttrain-auc:0.82513\teval-auc:0.74040\n",
      "[3200]\ttrain-auc:0.82722\teval-auc:0.74043\n",
      "[3300]\ttrain-auc:0.82922\teval-auc:0.74043\n",
      "[3400]\ttrain-auc:0.83121\teval-auc:0.74046\n",
      "[3500]\ttrain-auc:0.83315\teval-auc:0.74047\n",
      "[3600]\ttrain-auc:0.83509\teval-auc:0.74047\n",
      "[3700]\ttrain-auc:0.83696\teval-auc:0.74042\n",
      "[3800]\ttrain-auc:0.83886\teval-auc:0.74044\n",
      "[3900]\ttrain-auc:0.84080\teval-auc:0.74045\n",
      "[4000]\ttrain-auc:0.84267\teval-auc:0.74044\n",
      "[4100]\ttrain-auc:0.84453\teval-auc:0.74042\n",
      "Stopping. Best iteration:\n",
      "[3549]\ttrain-auc:0.83410\teval-auc:0.74048\n",
      "\n",
      "train_auc:0.8341027511949674,valid_auc0.740484779330328\n",
      "[0.7410306112419969, 0.7421619959324036, 0.740484779330328]\n",
      "[0]\ttrain-auc:0.71473\teval-auc:0.70834\n",
      "Multiple eval metrics have been passed: 'eval-auc' will be used for early stopping.\n",
      "\n",
      "Will train until eval-auc hasn't improved in 600 rounds.\n",
      "[100]\ttrain-auc:0.73573\teval-auc:0.72503\n",
      "[200]\ttrain-auc:0.74161\teval-auc:0.72827\n",
      "[300]\ttrain-auc:0.74738\teval-auc:0.73110\n",
      "[400]\ttrain-auc:0.75297\teval-auc:0.73349\n",
      "[500]\ttrain-auc:0.75790\teval-auc:0.73529\n",
      "[600]\ttrain-auc:0.76222\teval-auc:0.73654\n",
      "[700]\ttrain-auc:0.76605\teval-auc:0.73735\n",
      "[800]\ttrain-auc:0.76955\teval-auc:0.73801\n",
      "[900]\ttrain-auc:0.77284\teval-auc:0.73854\n",
      "[1000]\ttrain-auc:0.77603\teval-auc:0.73895\n",
      "[1100]\ttrain-auc:0.77907\teval-auc:0.73931\n",
      "[1200]\ttrain-auc:0.78189\teval-auc:0.73962\n",
      "[1300]\ttrain-auc:0.78461\teval-auc:0.73987\n",
      "[1400]\ttrain-auc:0.78737\teval-auc:0.74010\n",
      "[1500]\ttrain-auc:0.78990\teval-auc:0.74028\n",
      "[1600]\ttrain-auc:0.79260\teval-auc:0.74045\n",
      "[1700]\ttrain-auc:0.79521\teval-auc:0.74060\n",
      "[1800]\ttrain-auc:0.79756\teval-auc:0.74069\n",
      "[1900]\ttrain-auc:0.79993\teval-auc:0.74078\n",
      "[2000]\ttrain-auc:0.80227\teval-auc:0.74090\n",
      "[2100]\ttrain-auc:0.80443\teval-auc:0.74098\n",
      "[2200]\ttrain-auc:0.80673\teval-auc:0.74108\n",
      "[2300]\ttrain-auc:0.80903\teval-auc:0.74115\n",
      "[2400]\ttrain-auc:0.81119\teval-auc:0.74119\n",
      "[2500]\ttrain-auc:0.81334\teval-auc:0.74125\n",
      "[2600]\ttrain-auc:0.81532\teval-auc:0.74132\n",
      "[2700]\ttrain-auc:0.81736\teval-auc:0.74133\n",
      "[2800]\ttrain-auc:0.81941\teval-auc:0.74135\n",
      "[2900]\ttrain-auc:0.82151\teval-auc:0.74138\n",
      "[3000]\ttrain-auc:0.82346\teval-auc:0.74139\n",
      "[3100]\ttrain-auc:0.82551\teval-auc:0.74138\n",
      "[3200]\ttrain-auc:0.82737\teval-auc:0.74137\n",
      "[3300]\ttrain-auc:0.82932\teval-auc:0.74137\n",
      "[3400]\ttrain-auc:0.83135\teval-auc:0.74138\n",
      "[3500]\ttrain-auc:0.83336\teval-auc:0.74140\n",
      "[3600]\ttrain-auc:0.83537\teval-auc:0.74140\n",
      "[3700]\ttrain-auc:0.83727\teval-auc:0.74141\n",
      "[3800]\ttrain-auc:0.83928\teval-auc:0.74139\n",
      "[3900]\ttrain-auc:0.84101\teval-auc:0.74140\n",
      "[4000]\ttrain-auc:0.84282\teval-auc:0.74140\n",
      "[4100]\ttrain-auc:0.84459\teval-auc:0.74137\n",
      "[4200]\ttrain-auc:0.84641\teval-auc:0.74135\n",
      "Stopping. Best iteration:\n",
      "[3659]\ttrain-auc:0.83652\teval-auc:0.74142\n",
      "\n",
      "train_auc:0.8365153697612382,valid_auc0.7414243372223606\n",
      "[0.7410306112419969, 0.7421619959324036, 0.740484779330328, 0.7414243372223606]\n",
      "[0]\ttrain-auc:0.71487\teval-auc:0.70973\n",
      "Multiple eval metrics have been passed: 'eval-auc' will be used for early stopping.\n",
      "\n",
      "Will train until eval-auc hasn't improved in 600 rounds.\n",
      "[100]\ttrain-auc:0.73546\teval-auc:0.72562\n",
      "[200]\ttrain-auc:0.74155\teval-auc:0.72888\n",
      "[300]\ttrain-auc:0.74742\teval-auc:0.73173\n",
      "[400]\ttrain-auc:0.75303\teval-auc:0.73408\n",
      "[500]\ttrain-auc:0.75801\teval-auc:0.73588\n",
      "[600]\ttrain-auc:0.76225\teval-auc:0.73708\n",
      "[700]\ttrain-auc:0.76613\teval-auc:0.73794\n",
      "[800]\ttrain-auc:0.76952\teval-auc:0.73857\n",
      "[900]\ttrain-auc:0.77291\teval-auc:0.73903\n",
      "[1000]\ttrain-auc:0.77605\teval-auc:0.73940\n",
      "[1100]\ttrain-auc:0.77910\teval-auc:0.73969\n",
      "[1200]\ttrain-auc:0.78177\teval-auc:0.73996\n",
      "[1300]\ttrain-auc:0.78444\teval-auc:0.74023\n",
      "[1400]\ttrain-auc:0.78708\teval-auc:0.74042\n",
      "[1500]\ttrain-auc:0.78958\teval-auc:0.74060\n",
      "[1600]\ttrain-auc:0.79207\teval-auc:0.74080\n",
      "[1700]\ttrain-auc:0.79449\teval-auc:0.74096\n",
      "[1800]\ttrain-auc:0.79692\teval-auc:0.74111\n",
      "[1900]\ttrain-auc:0.79927\teval-auc:0.74120\n",
      "[2000]\ttrain-auc:0.80161\teval-auc:0.74132\n",
      "[2100]\ttrain-auc:0.80385\teval-auc:0.74138\n",
      "[2200]\ttrain-auc:0.80599\teval-auc:0.74146\n",
      "[2300]\ttrain-auc:0.80826\teval-auc:0.74149\n",
      "[2400]\ttrain-auc:0.81053\teval-auc:0.74154\n",
      "[2500]\ttrain-auc:0.81258\teval-auc:0.74161\n",
      "[2600]\ttrain-auc:0.81461\teval-auc:0.74166\n",
      "[2700]\ttrain-auc:0.81660\teval-auc:0.74171\n",
      "[2800]\ttrain-auc:0.81888\teval-auc:0.74176\n",
      "[2900]\ttrain-auc:0.82090\teval-auc:0.74180\n",
      "[3000]\ttrain-auc:0.82293\teval-auc:0.74181\n",
      "[3100]\ttrain-auc:0.82498\teval-auc:0.74183\n",
      "[3200]\ttrain-auc:0.82699\teval-auc:0.74183\n",
      "[3300]\ttrain-auc:0.82891\teval-auc:0.74185\n",
      "[3400]\ttrain-auc:0.83090\teval-auc:0.74188\n",
      "[3500]\ttrain-auc:0.83280\teval-auc:0.74187\n",
      "[3600]\ttrain-auc:0.83470\teval-auc:0.74185\n",
      "[3700]\ttrain-auc:0.83657\teval-auc:0.74187\n",
      "[3800]\ttrain-auc:0.83850\teval-auc:0.74186\n",
      "[3900]\ttrain-auc:0.84035\teval-auc:0.74184\n",
      "[4000]\ttrain-auc:0.84217\teval-auc:0.74185\n",
      "Stopping. Best iteration:\n",
      "[3413]\ttrain-auc:0.83116\teval-auc:0.74188\n",
      "\n",
      "train_auc:0.8311594512240275,valid_auc0.7418816706684692\n",
      "[0.7410306112419969, 0.7421619959324036, 0.740484779330328, 0.7414243372223606, 0.7418816706684692]\n",
      "all_auc: 0.5\n",
      "OOF-MEAN-AUC:0.741397, OOF-STD-AUC:0.000598\n",
      "Feature\n",
      "f16     16135.8\n",
      "f10     16058.8\n",
      "f40     15519.2\n",
      "f15     15317.8\n",
      "f59     14379.2\n",
      "f44     14302.4\n",
      "f54     13960.4\n",
      "f48     13195.0\n",
      "f49     13177.4\n",
      "f80     13096.4\n",
      "f66     12869.0\n",
      "f50     12733.8\n",
      "f55     12391.6\n",
      "f52     11521.6\n",
      "f7      10977.0\n",
      "f97     10956.4\n",
      "f77     10928.8\n",
      "f67     10920.8\n",
      "f96     10713.8\n",
      "f41     10524.2\n",
      "f3      10333.0\n",
      "f53     10288.4\n",
      "f56     10237.8\n",
      "f2      10105.2\n",
      "f27      9453.4\n",
      "f69      9417.0\n",
      "f84      9390.0\n",
      "f37      9349.4\n",
      "f61      9124.8\n",
      "f85      9058.6\n",
      "f88      8983.0\n",
      "f57      8923.8\n",
      "f78      8857.6\n",
      "f73      8564.0\n",
      "f38      8552.8\n",
      "f51      8237.8\n",
      "f81      8059.4\n",
      "f0       7960.4\n",
      "f17      7523.2\n",
      "f60      7504.0\n",
      "f64      7401.2\n",
      "f68      7278.4\n",
      "f100     7235.4\n",
      "f74      6962.6\n",
      "f35      6942.4\n",
      "f101     6779.6\n",
      "f46      6762.6\n",
      "f75      6541.2\n",
      "f26      6425.4\n",
      "f5       6320.4\n",
      "Name: importance, dtype: float64\n",
      "[0]\ttrain-auc:0.71558\teval-auc:0.70890\n",
      "Multiple eval metrics have been passed: 'eval-auc' will be used for early stopping.\n",
      "\n",
      "Will train until eval-auc hasn't improved in 600 rounds.\n",
      "[100]\ttrain-auc:0.73552\teval-auc:0.72448\n",
      "[200]\ttrain-auc:0.74137\teval-auc:0.72756\n",
      "[300]\ttrain-auc:0.74721\teval-auc:0.73044\n",
      "[400]\ttrain-auc:0.75279\teval-auc:0.73296\n",
      "[500]\ttrain-auc:0.75764\teval-auc:0.73474\n",
      "[600]\ttrain-auc:0.76195\teval-auc:0.73594\n",
      "[700]\ttrain-auc:0.76585\teval-auc:0.73688\n",
      "[800]\ttrain-auc:0.76943\teval-auc:0.73762\n",
      "[900]\ttrain-auc:0.77291\teval-auc:0.73817\n",
      "[1000]\ttrain-auc:0.77610\teval-auc:0.73860\n",
      "[1100]\ttrain-auc:0.77914\teval-auc:0.73892\n",
      "[1200]\ttrain-auc:0.78194\teval-auc:0.73918\n",
      "[1300]\ttrain-auc:0.78465\teval-auc:0.73940\n",
      "[1400]\ttrain-auc:0.78738\teval-auc:0.73958\n",
      "[1500]\ttrain-auc:0.79005\teval-auc:0.73978\n",
      "[1600]\ttrain-auc:0.79269\teval-auc:0.73993\n",
      "[1700]\ttrain-auc:0.79521\teval-auc:0.74009\n",
      "[1800]\ttrain-auc:0.79765\teval-auc:0.74016\n",
      "[1900]\ttrain-auc:0.79988\teval-auc:0.74026\n",
      "[2000]\ttrain-auc:0.80221\teval-auc:0.74035\n",
      "[2100]\ttrain-auc:0.80462\teval-auc:0.74042\n",
      "[2200]\ttrain-auc:0.80695\teval-auc:0.74051\n",
      "[2300]\ttrain-auc:0.80919\teval-auc:0.74055\n",
      "[2400]\ttrain-auc:0.81142\teval-auc:0.74062\n",
      "[2500]\ttrain-auc:0.81361\teval-auc:0.74066\n",
      "[2600]\ttrain-auc:0.81559\teval-auc:0.74070\n",
      "[2700]\ttrain-auc:0.81769\teval-auc:0.74077\n",
      "[2800]\ttrain-auc:0.81976\teval-auc:0.74081\n",
      "[2900]\ttrain-auc:0.82182\teval-auc:0.74084\n",
      "[3000]\ttrain-auc:0.82376\teval-auc:0.74087\n",
      "[3100]\ttrain-auc:0.82566\teval-auc:0.74084\n",
      "[3200]\ttrain-auc:0.82761\teval-auc:0.74082\n",
      "[3300]\ttrain-auc:0.82959\teval-auc:0.74083\n",
      "[3400]\ttrain-auc:0.83168\teval-auc:0.74082\n",
      "[3500]\ttrain-auc:0.83361\teval-auc:0.74083\n",
      "[3600]\ttrain-auc:0.83561\teval-auc:0.74083\n",
      "Stopping. Best iteration:\n",
      "[3001]\ttrain-auc:0.82378\teval-auc:0.74087\n",
      "\n",
      "train_auc:0.8237846310052888,valid_auc0.7408710900101825\n",
      "[0.7408710900101825]\n",
      "[0]\ttrain-auc:0.71535\teval-auc:0.71026\n",
      "Multiple eval metrics have been passed: 'eval-auc' will be used for early stopping.\n",
      "\n",
      "Will train until eval-auc hasn't improved in 600 rounds.\n",
      "[100]\ttrain-auc:0.73515\teval-auc:0.72623\n",
      "[200]\ttrain-auc:0.74091\teval-auc:0.72943\n",
      "[300]\ttrain-auc:0.74664\teval-auc:0.73244\n",
      "[400]\ttrain-auc:0.75235\teval-auc:0.73498\n",
      "[500]\ttrain-auc:0.75713\teval-auc:0.73689\n",
      "[600]\ttrain-auc:0.76129\teval-auc:0.73814\n",
      "[700]\ttrain-auc:0.76496\teval-auc:0.73906\n",
      "[800]\ttrain-auc:0.76828\teval-auc:0.73971\n",
      "[900]\ttrain-auc:0.77171\teval-auc:0.74023\n",
      "[1000]\ttrain-auc:0.77492\teval-auc:0.74061\n",
      "[1100]\ttrain-auc:0.77777\teval-auc:0.74097\n",
      "[1200]\ttrain-auc:0.78061\teval-auc:0.74127\n",
      "[1300]\ttrain-auc:0.78346\teval-auc:0.74154\n",
      "[1400]\ttrain-auc:0.78609\teval-auc:0.74176\n",
      "[1500]\ttrain-auc:0.78870\teval-auc:0.74196\n",
      "[1600]\ttrain-auc:0.79124\teval-auc:0.74219\n",
      "[1700]\ttrain-auc:0.79377\teval-auc:0.74236\n",
      "[1800]\ttrain-auc:0.79607\teval-auc:0.74250\n",
      "[1900]\ttrain-auc:0.79841\teval-auc:0.74264\n",
      "[2000]\ttrain-auc:0.80067\teval-auc:0.74274\n",
      "[2100]\ttrain-auc:0.80290\teval-auc:0.74281\n",
      "[2200]\ttrain-auc:0.80520\teval-auc:0.74288\n",
      "[2300]\ttrain-auc:0.80734\teval-auc:0.74293\n",
      "[2400]\ttrain-auc:0.80944\teval-auc:0.74300\n",
      "[2500]\ttrain-auc:0.81156\teval-auc:0.74310\n",
      "[2600]\ttrain-auc:0.81381\teval-auc:0.74315\n",
      "[2700]\ttrain-auc:0.81597\teval-auc:0.74321\n",
      "[2800]\ttrain-auc:0.81805\teval-auc:0.74325\n",
      "[2900]\ttrain-auc:0.82024\teval-auc:0.74326\n",
      "[3000]\ttrain-auc:0.82227\teval-auc:0.74331\n",
      "[3100]\ttrain-auc:0.82432\teval-auc:0.74333\n",
      "[3200]\ttrain-auc:0.82637\teval-auc:0.74335\n",
      "[3300]\ttrain-auc:0.82836\teval-auc:0.74336\n",
      "[3400]\ttrain-auc:0.83030\teval-auc:0.74335\n",
      "[3500]\ttrain-auc:0.83226\teval-auc:0.74335\n",
      "[3600]\ttrain-auc:0.83418\teval-auc:0.74338\n",
      "[3700]\ttrain-auc:0.83610\teval-auc:0.74338\n",
      "[3800]\ttrain-auc:0.83792\teval-auc:0.74336\n",
      "[3900]\ttrain-auc:0.83986\teval-auc:0.74337\n",
      "[4000]\ttrain-auc:0.84163\teval-auc:0.74336\n",
      "[4100]\ttrain-auc:0.84343\teval-auc:0.74333\n",
      "[4200]\ttrain-auc:0.84526\teval-auc:0.74332\n",
      "[4300]\ttrain-auc:0.84700\teval-auc:0.74329\n",
      "[4400]\ttrain-auc:0.84886\teval-auc:0.74331\n",
      "Stopping. Best iteration:\n",
      "[3887]\ttrain-auc:0.83958\teval-auc:0.74339\n",
      "\n",
      "train_auc:0.8395824734465787,valid_auc0.743385856458181\n",
      "[0.7408710900101825, 0.743385856458181]\n",
      "[0]\ttrain-auc:0.71605\teval-auc:0.70792\n",
      "Multiple eval metrics have been passed: 'eval-auc' will be used for early stopping.\n",
      "\n",
      "Will train until eval-auc hasn't improved in 600 rounds.\n",
      "[100]\ttrain-auc:0.73566\teval-auc:0.72388\n",
      "[200]\ttrain-auc:0.74147\teval-auc:0.72707\n",
      "[300]\ttrain-auc:0.74729\teval-auc:0.73022\n",
      "[400]\ttrain-auc:0.75291\teval-auc:0.73292\n",
      "[500]\ttrain-auc:0.75781\teval-auc:0.73476\n",
      "[600]\ttrain-auc:0.76209\teval-auc:0.73602\n",
      "[700]\ttrain-auc:0.76599\teval-auc:0.73703\n",
      "[800]\ttrain-auc:0.76947\teval-auc:0.73775\n",
      "[900]\ttrain-auc:0.77288\teval-auc:0.73830\n",
      "[1000]\ttrain-auc:0.77597\teval-auc:0.73874\n",
      "[1100]\ttrain-auc:0.77896\teval-auc:0.73908\n",
      "[1200]\ttrain-auc:0.78192\teval-auc:0.73939\n",
      "[1300]\ttrain-auc:0.78465\teval-auc:0.73966\n",
      "[1400]\ttrain-auc:0.78723\teval-auc:0.73988\n",
      "[1500]\ttrain-auc:0.78986\teval-auc:0.74003\n",
      "[1600]\ttrain-auc:0.79236\teval-auc:0.74018\n",
      "[1700]\ttrain-auc:0.79473\teval-auc:0.74031\n",
      "[1800]\ttrain-auc:0.79713\teval-auc:0.74046\n",
      "[1900]\ttrain-auc:0.79941\teval-auc:0.74058\n",
      "[2000]\ttrain-auc:0.80169\teval-auc:0.74065\n",
      "[2100]\ttrain-auc:0.80408\teval-auc:0.74077\n",
      "[2200]\ttrain-auc:0.80641\teval-auc:0.74086\n",
      "[2300]\ttrain-auc:0.80847\teval-auc:0.74088\n",
      "[2400]\ttrain-auc:0.81063\teval-auc:0.74093\n",
      "[2500]\ttrain-auc:0.81274\teval-auc:0.74096\n",
      "[2600]\ttrain-auc:0.81492\teval-auc:0.74103\n",
      "[2700]\ttrain-auc:0.81695\teval-auc:0.74106\n",
      "[2800]\ttrain-auc:0.81908\teval-auc:0.74109\n",
      "[2900]\ttrain-auc:0.82115\teval-auc:0.74114\n",
      "[3000]\ttrain-auc:0.82314\teval-auc:0.74117\n",
      "[3100]\ttrain-auc:0.82523\teval-auc:0.74117\n",
      "[3200]\ttrain-auc:0.82718\teval-auc:0.74118\n",
      "[3300]\ttrain-auc:0.82908\teval-auc:0.74120\n",
      "[3400]\ttrain-auc:0.83102\teval-auc:0.74121\n",
      "[3500]\ttrain-auc:0.83290\teval-auc:0.74123\n",
      "[3600]\ttrain-auc:0.83474\teval-auc:0.74121\n",
      "[3700]\ttrain-auc:0.83661\teval-auc:0.74124\n",
      "[3800]\ttrain-auc:0.83857\teval-auc:0.74122\n",
      "[3900]\ttrain-auc:0.84038\teval-auc:0.74122\n",
      "[4000]\ttrain-auc:0.84212\teval-auc:0.74122\n",
      "[4100]\ttrain-auc:0.84393\teval-auc:0.74121\n",
      "[4200]\ttrain-auc:0.84590\teval-auc:0.74116\n",
      "Stopping. Best iteration:\n",
      "[3632]\ttrain-auc:0.83534\teval-auc:0.74125\n",
      "\n",
      "train_auc:0.8353441401517223,valid_auc0.7412492395180381\n",
      "[0.7408710900101825, 0.743385856458181, 0.7412492395180381]\n",
      "[0]\ttrain-auc:0.71531\teval-auc:0.70918\n",
      "Multiple eval metrics have been passed: 'eval-auc' will be used for early stopping.\n",
      "\n",
      "Will train until eval-auc hasn't improved in 600 rounds.\n",
      "[100]\ttrain-auc:0.73547\teval-auc:0.72465\n",
      "[200]\ttrain-auc:0.74139\teval-auc:0.72792\n",
      "[300]\ttrain-auc:0.74725\teval-auc:0.73085\n",
      "[400]\ttrain-auc:0.75296\teval-auc:0.73326\n",
      "[500]\ttrain-auc:0.75783\teval-auc:0.73492\n",
      "[600]\ttrain-auc:0.76215\teval-auc:0.73604\n",
      "[700]\ttrain-auc:0.76590\teval-auc:0.73687\n",
      "[800]\ttrain-auc:0.76935\teval-auc:0.73745\n",
      "[900]\ttrain-auc:0.77286\teval-auc:0.73801\n",
      "[1000]\ttrain-auc:0.77609\teval-auc:0.73843\n",
      "[1100]\ttrain-auc:0.77907\teval-auc:0.73878\n",
      "[1200]\ttrain-auc:0.78197\teval-auc:0.73901\n",
      "[1300]\ttrain-auc:0.78468\teval-auc:0.73923\n",
      "[1400]\ttrain-auc:0.78723\teval-auc:0.73943\n",
      "[1500]\ttrain-auc:0.78989\teval-auc:0.73962\n",
      "[1600]\ttrain-auc:0.79225\teval-auc:0.73972\n",
      "[1700]\ttrain-auc:0.79457\teval-auc:0.73984\n",
      "[1800]\ttrain-auc:0.79703\teval-auc:0.73995\n",
      "[1900]\ttrain-auc:0.79931\teval-auc:0.74005\n",
      "[2000]\ttrain-auc:0.80178\teval-auc:0.74015\n",
      "[2100]\ttrain-auc:0.80416\teval-auc:0.74021\n",
      "[2200]\ttrain-auc:0.80650\teval-auc:0.74026\n",
      "[2300]\ttrain-auc:0.80867\teval-auc:0.74034\n",
      "[2400]\ttrain-auc:0.81079\teval-auc:0.74037\n",
      "[2500]\ttrain-auc:0.81301\teval-auc:0.74038\n",
      "[2600]\ttrain-auc:0.81504\teval-auc:0.74041\n",
      "[2700]\ttrain-auc:0.81721\teval-auc:0.74046\n",
      "[2800]\ttrain-auc:0.81920\teval-auc:0.74048\n",
      "[2900]\ttrain-auc:0.82126\teval-auc:0.74048\n",
      "[3000]\ttrain-auc:0.82316\teval-auc:0.74051\n",
      "[3100]\ttrain-auc:0.82533\teval-auc:0.74056\n",
      "[3200]\ttrain-auc:0.82734\teval-auc:0.74054\n",
      "[3300]\ttrain-auc:0.82935\teval-auc:0.74054\n",
      "[3400]\ttrain-auc:0.83133\teval-auc:0.74052\n",
      "[3500]\ttrain-auc:0.83339\teval-auc:0.74052\n",
      "[3600]\ttrain-auc:0.83529\teval-auc:0.74053\n",
      "[3700]\ttrain-auc:0.83713\teval-auc:0.74051\n",
      "Stopping. Best iteration:\n",
      "[3112]\ttrain-auc:0.82558\teval-auc:0.74057\n",
      "\n",
      "train_auc:0.8255837489153214,valid_auc0.7405699817263026\n",
      "[0.7408710900101825, 0.743385856458181, 0.7412492395180381, 0.7405699817263026]\n",
      "[0]\ttrain-auc:0.71542\teval-auc:0.70879\n",
      "Multiple eval metrics have been passed: 'eval-auc' will be used for early stopping.\n",
      "\n",
      "Will train until eval-auc hasn't improved in 600 rounds.\n",
      "[100]\ttrain-auc:0.73570\teval-auc:0.72402\n",
      "[200]\ttrain-auc:0.74146\teval-auc:0.72700\n",
      "[300]\ttrain-auc:0.74745\teval-auc:0.72992\n",
      "[400]\ttrain-auc:0.75312\teval-auc:0.73239\n",
      "[500]\ttrain-auc:0.75797\teval-auc:0.73415\n",
      "[600]\ttrain-auc:0.76231\teval-auc:0.73528\n",
      "[700]\ttrain-auc:0.76601\teval-auc:0.73616\n",
      "[800]\ttrain-auc:0.76958\teval-auc:0.73686\n",
      "[900]\ttrain-auc:0.77304\teval-auc:0.73737\n",
      "[1000]\ttrain-auc:0.77614\teval-auc:0.73781\n",
      "[1100]\ttrain-auc:0.77913\teval-auc:0.73820\n",
      "[1200]\ttrain-auc:0.78199\teval-auc:0.73849\n",
      "[1300]\ttrain-auc:0.78462\teval-auc:0.73873\n",
      "[1400]\ttrain-auc:0.78716\teval-auc:0.73893\n",
      "[1500]\ttrain-auc:0.78971\teval-auc:0.73912\n",
      "[1600]\ttrain-auc:0.79208\teval-auc:0.73928\n",
      "[1700]\ttrain-auc:0.79456\teval-auc:0.73945\n",
      "[1800]\ttrain-auc:0.79699\teval-auc:0.73960\n",
      "[1900]\ttrain-auc:0.79944\teval-auc:0.73974\n",
      "[2000]\ttrain-auc:0.80178\teval-auc:0.73986\n",
      "[2100]\ttrain-auc:0.80394\teval-auc:0.73991\n",
      "[2200]\ttrain-auc:0.80636\teval-auc:0.74000\n",
      "[2300]\ttrain-auc:0.80861\teval-auc:0.74011\n",
      "[2400]\ttrain-auc:0.81069\teval-auc:0.74018\n",
      "[2500]\ttrain-auc:0.81278\teval-auc:0.74027\n",
      "[2600]\ttrain-auc:0.81496\teval-auc:0.74032\n",
      "[2700]\ttrain-auc:0.81711\teval-auc:0.74037\n",
      "[2800]\ttrain-auc:0.81927\teval-auc:0.74039\n",
      "[2900]\ttrain-auc:0.82133\teval-auc:0.74045\n",
      "[3000]\ttrain-auc:0.82334\teval-auc:0.74045\n",
      "[3100]\ttrain-auc:0.82517\teval-auc:0.74048\n",
      "[3200]\ttrain-auc:0.82700\teval-auc:0.74048\n",
      "[3300]\ttrain-auc:0.82899\teval-auc:0.74054\n",
      "[3400]\ttrain-auc:0.83096\teval-auc:0.74057\n",
      "[3500]\ttrain-auc:0.83286\teval-auc:0.74057\n",
      "[3600]\ttrain-auc:0.83476\teval-auc:0.74057\n",
      "[3700]\ttrain-auc:0.83675\teval-auc:0.74055\n",
      "[3800]\ttrain-auc:0.83871\teval-auc:0.74053\n",
      "[3900]\ttrain-auc:0.84062\teval-auc:0.74055\n",
      "[4000]\ttrain-auc:0.84239\teval-auc:0.74057\n",
      "[4100]\ttrain-auc:0.84427\teval-auc:0.74058\n",
      "[4200]\ttrain-auc:0.84607\teval-auc:0.74058\n",
      "[4300]\ttrain-auc:0.84786\teval-auc:0.74058\n",
      "[4400]\ttrain-auc:0.84958\teval-auc:0.74055\n",
      "[4500]\ttrain-auc:0.85131\teval-auc:0.74056\n",
      "[4600]\ttrain-auc:0.85303\teval-auc:0.74055\n",
      "[4700]\ttrain-auc:0.85484\teval-auc:0.74053\n",
      "Stopping. Best iteration:\n",
      "[4154]\ttrain-auc:0.84528\teval-auc:0.74059\n",
      "\n",
      "train_auc:0.8452848027809972,valid_auc0.7405940211925574\n",
      "[0.7408710900101825, 0.743385856458181, 0.7412492395180381, 0.7405699817263026, 0.7405940211925574]\n",
      "all_auc: 0.5\n",
      "OOF-MEAN-AUC:0.741334, OOF-STD-AUC:0.001055\n",
      "Feature\n",
      "f10     14652.6\n",
      "f16     14619.4\n",
      "f15     14475.4\n",
      "f59     14332.4\n",
      "f44     14001.6\n",
      "f54     13735.6\n",
      "f40     13571.2\n",
      "f48     12622.2\n",
      "f49     12349.4\n",
      "f50     12047.4\n",
      "f80     11939.2\n",
      "f66     11524.2\n",
      "f55     11419.2\n",
      "f52     10937.2\n",
      "f7      10529.0\n",
      "f96     10430.6\n",
      "f77     10373.4\n",
      "f97     10274.6\n",
      "f56      9960.0\n",
      "f3       9793.6\n",
      "f41      9603.8\n",
      "f67      9601.2\n",
      "f53      9590.0\n",
      "f2       9528.0\n",
      "f27      9032.4\n",
      "f69      8983.4\n",
      "f84      8941.2\n",
      "f37      8834.2\n",
      "f61      8698.6\n",
      "f88      8685.0\n",
      "f57      8605.0\n",
      "f85      8517.8\n",
      "f78      8263.8\n",
      "f73      8246.8\n",
      "f38      7933.4\n",
      "f60      7739.4\n",
      "f0       7575.0\n",
      "f51      7561.4\n",
      "f81      7496.6\n",
      "f17      7305.8\n",
      "f68      7214.8\n",
      "f64      7191.6\n",
      "f100     6755.2\n",
      "f35      6602.0\n",
      "f101     6420.8\n",
      "f74      6200.8\n",
      "f75      6101.6\n",
      "f5       6057.6\n",
      "f26      5990.0\n",
      "f29      5968.0\n",
      "Name: importance, dtype: float64\n",
      "[0]\ttrain-auc:0.71639\teval-auc:0.70848\n",
      "Multiple eval metrics have been passed: 'eval-auc' will be used for early stopping.\n",
      "\n",
      "Will train until eval-auc hasn't improved in 600 rounds.\n",
      "[100]\ttrain-auc:0.73479\teval-auc:0.72287\n",
      "[200]\ttrain-auc:0.74121\teval-auc:0.72652\n",
      "[300]\ttrain-auc:0.74764\teval-auc:0.72998\n",
      "[400]\ttrain-auc:0.75317\teval-auc:0.73244\n",
      "[500]\ttrain-auc:0.75797\teval-auc:0.73424\n",
      "[600]\ttrain-auc:0.76219\teval-auc:0.73544\n",
      "[700]\ttrain-auc:0.76600\teval-auc:0.73626\n",
      "[800]\ttrain-auc:0.76960\teval-auc:0.73691\n",
      "[900]\ttrain-auc:0.77302\teval-auc:0.73740\n"
     ]
    }
   ],
   "source": [
    "# coding: utf-8\n",
    "import multiprocessing\n",
    "from collections import Counter\n",
    "import xgboost as xgb\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import warnings\n",
    "\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "import lightgbm as lgb\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "from sklearn.decomposition import TruncatedSVD\n",
    "from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer\n",
    "from tqdm import tqdm\n",
    "from sklearn.model_selection import KFold\n",
    "import gc\n",
    "from sklearn import preprocessing\n",
    "from scipy.stats import entropy\n",
    "# from imblearn.over_sampling import SMOTE\n",
    "# from imblearn.under_sampling import RandomUnderSampler\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn import metrics\n",
    "from sklearn.metrics import make_scorer, roc_auc_score\n",
    "from sklearn.metrics import roc_auc_score, roc_curve\n",
    "import datetime\n",
    "import time\n",
    "from itertools import product\n",
    "\n",
    "nowtime = datetime.date.today()\n",
    "nowtime = str(nowtime)[-5:]\n",
    "print(nowtime)\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "\n",
    "def load_dataset(DATA_PATH):\n",
    "    train_label = pd.read_csv(DATA_PATH + 'train.csv')['isDefault']\n",
    "    train = pd.read_csv(DATA_PATH + 'train.csv')\n",
    "    test = pd.read_csv(DATA_PATH + 'testA.csv')\n",
    "\n",
    "    feats = [f for f in train.columns if f not in ['n_2.1', 'n2.2', 'n2.3', 'isDefault']]\n",
    "    # train = train[feats]\n",
    "    test = test[feats]\n",
    "    print('train.shape', train.shape)\n",
    "    print('test.shape', test.shape)\n",
    "\n",
    "    return train_label, train, test\n",
    "\n",
    "\n",
    "# 处理时间\n",
    "def transform_time(x):\n",
    "    day = int(x.split(' ')[0])\n",
    "    hour = int(x.split(' ')[2].split('.')[0].split(':')[0])\n",
    "    minute = int(x.split(' ')[2].split('.')[0].split(':')[1])\n",
    "    second = int(x.split(' ')[2].split('.')[0].split(':')[2])\n",
    "    return 86400 * day + 3600 * hour + 60 * minute + second\n",
    "\n",
    "\n",
    "def transform_day(date1):\n",
    "    date2 = \"2025-01-01\"\n",
    "    date1 = time.strptime(date1, \"%Y-%m-%d\")\n",
    "    date2 = time.strptime(date2, \"%Y-%m-%d\")\n",
    "\n",
    "    # 根据上面需要计算日期还是日期时间，来确定需要几个数组段。下标0表示年，小标1表示月，依次类推...\n",
    "    # date1=datetime.datetime(date1[0],date1[1],date1[2],date1[3],date1[4],date1[5])\n",
    "    # date2=datetime.datetime(date2[0],date2[1],date2[2],date2[3],date2[4],date2[5])\n",
    "    date1 = datetime.datetime(date1[0], date1[1], date1[2])\n",
    "    date2 = datetime.datetime(date2[0], date2[1], date2[2])\n",
    "    # 返回两个变量相差的值，就是相差天数\n",
    "    # print((date2 - date1).days)  # 将天数转成int型\n",
    "    return (date2 - date1).days\n",
    "\n",
    "\n",
    "# transform_day('2007-09-01')\n",
    "\n",
    "def labelEncoder_df(df, features):\n",
    "    for i in features:\n",
    "        encoder = preprocessing.LabelEncoder()\n",
    "        df[i] = encoder.fit_transform(df[i])\n",
    "\n",
    "\n",
    "\n",
    "class MeanEncoder:\n",
    "    def __init__(self, categorical_features, n_splits=5, target_type='classification', prior_weight_func=None):\n",
    "        \"\"\"\n",
    "        :param categorical_features: list of str, the name of the categorical columns to encode\n",
    "\n",
    "        :param n_splits: the number of splits used in mean encoding\n",
    "\n",
    "        :param target_type: str, 'regression' or 'classification'\n",
    "\n",
    "        :param prior_weight_func:\n",
    "        a function that takes in the number of observations, and outputs prior weight\n",
    "        when a dict is passed, the default exponential decay function will be used:\n",
    "        k: the number of observations needed for the posterior to be weighted equally as the prior\n",
    "        f: larger f --> smaller slope\n",
    "        \"\"\"\n",
    "\n",
    "        self.categorical_features = categorical_features\n",
    "        self.n_splits = n_splits\n",
    "        self.learned_stats = {}\n",
    "\n",
    "        if target_type == 'classification':\n",
    "            self.target_type = target_type\n",
    "            self.target_values = []\n",
    "        else:\n",
    "            self.target_type = 'regression'\n",
    "            self.target_values = None\n",
    "\n",
    "        if isinstance(prior_weight_func, dict):\n",
    "            self.prior_weight_func = eval('lambda x: 1 / (1 + np.exp((x - k) / f))', dict(prior_weight_func, np=np))\n",
    "        elif callable(prior_weight_func):\n",
    "            self.prior_weight_func = prior_weight_func\n",
    "        else:\n",
    "            self.prior_weight_func = lambda x: 1 / (1 + np.exp((x - 2) / 1))\n",
    "\n",
    "    @staticmethod\n",
    "    def mean_encode_subroutine(X_train, y_train, X_test, variable, target, prior_weight_func):\n",
    "        X_train = X_train[[variable]].copy()\n",
    "        X_test = X_test[[variable]].copy()\n",
    "\n",
    "        if target is not None:\n",
    "            nf_name = '{}_pred_{}'.format(variable, target)\n",
    "            X_train['pred_temp'] = (y_train == target).astype(int)  # classification\n",
    "        else:\n",
    "            nf_name = '{}_pred'.format(variable)\n",
    "            X_train['pred_temp'] = y_train  # regression\n",
    "        prior = X_train['pred_temp'].mean()\n",
    "\n",
    "        col_avg_y = X_train.groupby(by=variable, axis=0)['pred_temp'].agg(['mean', 'size'])\n",
    "        col_avg_y.rename(columns={'mean': 'mean', 'size': 'beta'}, inplace=True)\n",
    "\n",
    "        col_avg_y['beta'] = prior_weight_func(col_avg_y['beta'])\n",
    "        col_avg_y[nf_name] = col_avg_y['beta'] * prior + (1 - col_avg_y['beta']) * col_avg_y['mean']\n",
    "        col_avg_y.drop(['beta', 'mean'], axis=1, inplace=True)\n",
    "\n",
    "        nf_train = X_train.join(col_avg_y, on=variable)[nf_name].values\n",
    "        nf_test = X_test.join(col_avg_y, on=variable).fillna(prior, inplace=False)[nf_name].values\n",
    "\n",
    "        return nf_train, nf_test, prior, col_avg_y\n",
    "\n",
    "    def fit_transform(self, X, y):\n",
    "        \"\"\"\n",
    "        :param X: pandas DataFrame, n_samples * n_features\n",
    "        :param y: pandas Series or numpy array, n_samples\n",
    "        :return X_new: the transformed pandas DataFrame containing mean-encoded categorical features\n",
    "        \"\"\"\n",
    "        X_new = X.copy()\n",
    "        if self.target_type == 'classification':\n",
    "            skf = StratifiedKFold(self.n_splits)\n",
    "        else:\n",
    "            skf = KFold(self.n_splits)\n",
    "\n",
    "        if self.target_type == 'classification':\n",
    "            self.target_values = sorted(set(y))\n",
    "            self.learned_stats = {'{}_pred_{}'.format(variable, target): [] for variable, target in\n",
    "                                  product(self.categorical_features, self.target_values)}\n",
    "            for variable, target in product(self.categorical_features, self.target_values):\n",
    "                nf_name = '{}_pred_{}'.format(variable, target)\n",
    "                X_new.loc[:, nf_name] = np.nan\n",
    "                for large_ind, small_ind in skf.split(y, y):\n",
    "                    nf_large, nf_small, prior, col_avg_y = MeanEncoder.mean_encode_subroutine(\n",
    "                        X_new.iloc[large_ind], y.iloc[large_ind], X_new.iloc[small_ind], variable, target,\n",
    "                        self.prior_weight_func)\n",
    "                    X_new.iloc[small_ind, -1] = nf_small\n",
    "                    self.learned_stats[nf_name].append((prior, col_avg_y))\n",
    "        else:\n",
    "            self.learned_stats = {'{}_pred'.format(variable): [] for variable in self.categorical_features}\n",
    "            for variable in self.categorical_features:\n",
    "                nf_name = '{}_pred'.format(variable)\n",
    "                X_new.loc[:, nf_name] = np.nan\n",
    "                for large_ind, small_ind in skf.split(y, y):\n",
    "                    nf_large, nf_small, prior, col_avg_y = MeanEncoder.mean_encode_subroutine(\n",
    "                        X_new.iloc[large_ind], y.iloc[large_ind], X_new.iloc[small_ind], variable, None,\n",
    "                        self.prior_weight_func)\n",
    "                    X_new.iloc[small_ind, -1] = nf_small\n",
    "                    self.learned_stats[nf_name].append((prior, col_avg_y))\n",
    "        return X_new\n",
    "\n",
    "    def transform(self, X):\n",
    "        \"\"\"\n",
    "        :param X: pandas DataFrame, n_samples * n_features\n",
    "        :return X_new: the transformed pandas DataFrame containing mean-encoded categorical features\n",
    "        \"\"\"\n",
    "        X_new = X.copy()\n",
    "\n",
    "        if self.target_type == 'classification':\n",
    "            for variable, target in product(self.categorical_features, self.target_values):\n",
    "                nf_name = '{}_pred_{}'.format(variable, target)\n",
    "                X_new[nf_name] = 0\n",
    "                for prior, col_avg_y in self.learned_stats[nf_name]:\n",
    "                    X_new[nf_name] += X_new[[variable]].join(col_avg_y, on=variable).fillna(prior, inplace=False)[\n",
    "                        nf_name]\n",
    "                X_new[nf_name] /= self.n_splits\n",
    "        else:\n",
    "            for variable in self.categorical_features:\n",
    "                nf_name = '{}_pred'.format(variable)\n",
    "                X_new[nf_name] = 0\n",
    "                for prior, col_avg_y in self.learned_stats[nf_name]:\n",
    "                    X_new[nf_name] += X_new[[variable]].join(col_avg_y, on=variable).fillna(prior, inplace=False)[\n",
    "                        nf_name]\n",
    "                X_new[nf_name] /= self.n_splits\n",
    "\n",
    "        return X_new\n",
    "\n",
    "\n",
    "\n",
    "def employmentLength_deal(x):\n",
    "    if x == r'\\N':\n",
    "        result = -999\n",
    "    elif x == -999:\n",
    "        result = -999\n",
    "    elif x == '-999':\n",
    "        result = -999\n",
    "    elif x == '< 1 year':\n",
    "        result = 0.5\n",
    "    elif x == '10+ years':\n",
    "        result = 12\n",
    "    else:\n",
    "        result = int(x.split(' ')[0][0])\n",
    "    # print(result)\n",
    "    return result\n",
    "\n",
    "\n",
    "def earliesCreditLine_month_deal(x):\n",
    "    x = x.split('-')[0]\n",
    "    # print(x)\n",
    "    dict = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6, 'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10,\n",
    "            'Nov': 11, 'Dec': 12}\n",
    "    result = dict[x]\n",
    "    return result\n",
    "\n",
    "\n",
    "def gradeTrans(x):\n",
    "    dict = {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7}\n",
    "    result = dict[x]\n",
    "    return result\n",
    "\n",
    "\n",
    "def subGradeTrans(x):\n",
    "    dict = {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7}\n",
    "    result = dict[x[0]]\n",
    "    result = result * 5 + int(x[1])\n",
    "    return result\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "def myEntro(x):\n",
    "    \n",
    "    x = np.array(x)\n",
    "    x_value_list = set([x[i] for i in range(x.shape[0])])\n",
    "    ent = 0.0\n",
    "    for x_value in x_value_list:\n",
    "        p = float(x[x == x_value].shape[0]) / x.shape[0]\n",
    "        logp = np.log2(p)\n",
    "        ent -= p * logp\n",
    "    #     print(x_value,p,logp)\n",
    "    # print(ent)\n",
    "    return ent\n",
    "\n",
    "\n",
    "def myRms(records):\n",
    "    records = list(records)\n",
    "    return np.math.sqrt(sum([x ** 2 for x in records]) / len(records))\n",
    "\n",
    "\n",
    "def myMode(x):\n",
    "    return np.mean(pd.Series.mode(x))\n",
    "\n",
    "\n",
    "def myQ25(x):\n",
    "    return x.quantile(0.25)\n",
    "\n",
    "\n",
    "def myQ75(x):\n",
    "    return x.quantile(0.75)\n",
    "\n",
    "\n",
    "def myRange(x):\n",
    "    return pd.Series.max(x) - pd.Series.min(x)\n",
    "\n",
    "\n",
    "# 预处理\n",
    "def data_preprocess(DATA_PATH):\n",
    "    train_label, train, test = load_dataset(DATA_PATH=DATA_PATH)\n",
    "    # 拼接数据\n",
    "\n",
    "    data = pd.concat([train, test], axis=0, ignore_index=True)\n",
    "    print('初始拼接后：', data.shape)\n",
    "    # n_feat = [f for f in data.columns if f[0] == 'n']\n",
    "\n",
    "    n_feat = ['n0', 'n1', 'n2', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9', 'n10', 'n11', 'n12', 'n13', 'n14', ]\n",
    "    # nameList = ['min', 'max', 'sum', 'mean', 'median', 'skew', 'std', 'mode', 'range']\n",
    "    # statList = ['min', 'max', 'sum', 'mean', 'median', 'skew', 'std', myMode, myRange]\n",
    "    nameList = ['max', 'sum', 'mean', 'median', 'skew', 'std']\n",
    "    statList = ['max', 'sum', 'mean', 'median', 'skew', 'std']\n",
    "\n",
    "\n",
    "    for i in range(len(nameList)):\n",
    "        data['n_feat_{}'.format(nameList[i])] = data[n_feat].agg(statList[i], axis=1)\n",
    "    print('n特征处理后：', data.shape)\n",
    "\n",
    "\n",
    "    # count编码\n",
    "    count_list = ['subGrade', 'grade', 'postCode', 'regionCode','homeOwnership','title','employmentTitle','employmentLength']\n",
    "    data = count_coding(data, count_list)\n",
    "    print('count编码后：', data.shape)\n",
    "    ### 用数值特征对类别特征做统计刻画，随便挑了几个跟price相关性最高的匿名特征\n",
    "    cross_cat = ['subGrade', 'grade', 'employmentLength', 'term', 'homeOwnership', 'postCode', 'regionCode','employmentTitle','title']\n",
    "    cross_num = ['dti', 'revolBal','revolUtil', 'ficoRangeHigh', 'interestRate', 'loanAmnt', 'installment', 'annualIncome', 'n14',\n",
    "                 'n2', 'n6', 'n9', 'n5', 'n8']\n",
    "\n",
    "    data[['employmentLength']].fillna(-999, inplace=True)\n",
    "\n",
    "#     data = cross_cat_num(data, cross_num, cross_cat)  # 一阶交叉\n",
    "#     print('一阶特征处理后：', data.shape)\n",
    "#     data = cross_qua_cat_num(data)  # 二阶交叉\n",
    "#     print('二阶特征处理后：', data.shape)\n",
    "    # 缺失值处理\n",
    "    for temp in count_list:\n",
    "        del data[temp+'_count']\n",
    "    # num_fill_col = ['employmentLength', 'postCode', ]\n",
    "    cols = ['employmentTitle', 'employmentLength', 'postCode', 'dti', 'pubRecBankruptcies', 'revolUtil', 'title',\n",
    "            'n0', 'n1', 'n2', 'n4', 'n5', 'n6', 'n7', 'n8', 'n9', 'n10', 'n11', 'n12', 'n13', 'n14']\n",
    "    for col in cols:\n",
    "        data[col].fillna(r'\\N', inplace=True)\n",
    "    cols = [f for f in cols if f not in ['employmentLength']]\n",
    "    for col in cols:\n",
    "        data[col].replace({r'\\N': -999}, inplace=True)\n",
    "        data[col] = data[col]\n",
    "    # print('缺失值情况：', data.isnull().sum())\n",
    "\n",
    "    data['grade'] = data['grade'].apply(lambda x: gradeTrans(x))\n",
    "    data['subGrade'] = data['subGrade'].apply(lambda x: subGradeTrans(x))\n",
    "    print('1data.shape', data.shape)\n",
    "\n",
    "    data['employmentLength'] = data['employmentLength'].apply(lambda x: employmentLength_deal(x))\n",
    "    data['issueDate_year'] = data['issueDate'].apply(lambda x: int(x.split('-')[0]))\n",
    "    data['issueDate_month'] = data['issueDate'].apply(lambda x: int(x.split('-')[1]))\n",
    "    data['issueDate_day'] = data['issueDate'].apply(lambda x: transform_day(x))\n",
    "    data['issueDate_week'] = data['issueDate_day'].apply(lambda x: int(x % 7) + 1)\n",
    "\n",
    "    print('2_data.shape', data.shape)\n",
    "    data['earliesCreditLine_year'] = data['earliesCreditLine'].apply(lambda x: 2020 - (int(x.split('-')[-1])))\n",
    "    data['earliesCreditLine_month'] = data['earliesCreditLine'].apply(lambda x: earliesCreditLine_month_deal(x))\n",
    "    data['earliesCreditLine_Allmonth'] = data['earliesCreditLine_year'] * 12 - data['earliesCreditLine_month']\n",
    "    del data['issueDate'], data['earliesCreditLine']\n",
    "\n",
    "    print('预处理完毕', data.shape)\n",
    "\n",
    "    return data, train_label\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "def kfold_stats_feature(train, test, feats, k):\n",
    "    folds = StratifiedKFold(n_splits=k, shuffle=True, random_state=6666)  # 这里最好和后面模型的K折交叉验证保持一致\n",
    "\n",
    "    train['fold'] = None\n",
    "    for fold_, (trn_idx, val_idx) in enumerate(folds.split(train, train['isDefault'])):\n",
    "        train.loc[val_idx, 'fold'] = fold_\n",
    "\n",
    "    kfold_features = []\n",
    "    for feat in feats:\n",
    "        nums_columns = ['isDefault']\n",
    "        for f in nums_columns:\n",
    "            colname = feat + '_' + f + '_kfold_mean'\n",
    "            kfold_features.append(colname)\n",
    "            train[colname] = None\n",
    "            for fold_, (trn_idx, val_idx) in enumerate(folds.split(train, train['isDefault'])):\n",
    "                tmp_trn = train.iloc[trn_idx]\n",
    "                order_label = tmp_trn.groupby([feat])[f].mean()\n",
    "                tmp = train.loc[train.fold == fold_, [feat]]\n",
    "                train.loc[train.fold == fold_, colname] = tmp[feat].map(order_label)\n",
    "                # fillna\n",
    "                global_mean = train[f].mean()\n",
    "                train.loc[train.fold == fold_, colname] = train.loc[train.fold == fold_, colname].fillna(global_mean)\n",
    "            train[colname] = train[colname].astype(float)\n",
    "\n",
    "        for f in nums_columns:\n",
    "            colname = feat + '_' + f + '_kfold_mean'\n",
    "            test[colname] = None\n",
    "            order_label = train.groupby([feat])[f].mean()\n",
    "            test[colname] = test[feat].map(order_label)\n",
    "            # fillna\n",
    "            global_mean = train[f].mean()\n",
    "            test[colname] = test[colname].fillna(global_mean)\n",
    "            test[colname] = test[colname].astype(float)\n",
    "    del train['fold']\n",
    "    return train, test\n",
    "\n",
    "def GridSearch(clf, params, X, y):\n",
    "    cscv = GridSearchCV(clf, params, scoring='roc_auc', n_jobs=4, cv=10)\n",
    "    cscv.fit(X, y)\n",
    "    print(cscv.cv_results_)\n",
    "    print(cscv.best_params_)\n",
    "    print(cscv.best_score_)\n",
    "\n",
    "### count编码\n",
    "def count_coding(df, fea_col):\n",
    "    for f in fea_col:\n",
    "        df[f + '_count'] = df[f].map(df[f].value_counts())\n",
    "    return (df)\n",
    "\n",
    "\n",
    "# 定义交叉特征统计\n",
    "def cross_cat_num(df, num_col, cat_col):\n",
    "    for f1 in tqdm(cat_col):\n",
    "        g = df.groupby(f1, as_index=False)\n",
    "        for f2 in tqdm(num_col):\n",
    "            feat = g[f2].agg({\n",
    "                '{}_{}_max'.format(f1, f2): 'max', '{}_{}_min'.format(f1, f2): 'min',\n",
    "                '{}_{}_median'.format(f1, f2): 'median',\n",
    "            })\n",
    "            df = df.merge(feat, on=f1, how='left')\n",
    "    return (df)\n",
    "\n",
    "\n",
    "def cross_qua_cat_num(df):\n",
    "    for f_pair in tqdm([\n",
    "        ['subGrade', 'regionCode'], ['grade', 'regionCode'], ['subGrade', 'postCode'], ['grade', 'postCode'], ['employmentTitle','title'],\n",
    "        ['regionCode','title'], ['postCode','title'], ['homeOwnership','title'], ['homeOwnership','employmentTitle'],['homeOwnership','employmentLength'],\n",
    "        ['regionCode', 'postCode']\n",
    "    ]):\n",
    "        ### 共现次数\n",
    "        df['_'.join(f_pair) + '_count'] = df.groupby(f_pair)['id'].transform('count')\n",
    "        ### n unique、熵\n",
    "        df = df.merge(df.groupby(f_pair[0], as_index=False)[f_pair[1]].agg({\n",
    "            '{}_{}_nunique'.format(f_pair[0], f_pair[1]): 'nunique',\n",
    "            '{}_{}_ent'.format(f_pair[0], f_pair[1]): lambda x: entropy(x.value_counts() / x.shape[0])\n",
    "        }), on=f_pair[0], how='left')\n",
    "        df = df.merge(df.groupby(f_pair[1], as_index=False)[f_pair[0]].agg({\n",
    "            '{}_{}_nunique'.format(f_pair[1], f_pair[0]): 'nunique',\n",
    "            '{}_{}_ent'.format(f_pair[1], f_pair[0]): lambda x: entropy(x.value_counts() / x.shape[0])\n",
    "        }), on=f_pair[1], how='left')\n",
    "        ### 比例偏好\n",
    "        df['{}_in_{}_prop'.format(f_pair[0], f_pair[1])] = df['_'.join(f_pair) + '_count'] / df[f_pair[1] + '_count']\n",
    "        df['{}_in_{}_prop'.format(f_pair[1], f_pair[0])] = df['_'.join(f_pair) + '_count'] / df[f_pair[0] + '_count']\n",
    "    return (df)\n",
    "\n",
    "\n",
    "### count编码\n",
    "def count_coding(df, fea_col):\n",
    "    for f in fea_col:\n",
    "        df[f + '_count'] = df[f].map(df[f].value_counts())\n",
    "    return (df)\n",
    "\n",
    "def gen_basicFea(data):\n",
    "    data['avg_income'] = data['annualIncome'] / data['employmentLength']\n",
    "    data['total_income'] = data['annualIncome'] * data['employmentLength']\n",
    "    data['avg_loanAmnt'] = data['loanAmnt'] / data['term']\n",
    "    data['mean_interestRate'] = data['interestRate'] / data['term']\n",
    "    data['all_installment'] = data['installment'] * data['term']\n",
    "\n",
    "    data['rest_money_rate'] = data['avg_loanAmnt'] / (data['annualIncome'] + 0.1)  # 287个收入为0\n",
    "    data['rest_money'] = data['annualIncome'] - data['avg_loanAmnt']\n",
    "\n",
    "    data['closeAcc'] = data['totalAcc'] - data['openAcc']\n",
    "    data['ficoRange_mean'] = (data['ficoRangeHigh'] + data['ficoRangeLow']) / 2\n",
    "    del data['ficoRangeHigh'], data['ficoRangeLow']\n",
    "\n",
    "    data['rest_pubRec'] = data['pubRec'] - data['pubRecBankruptcies']\n",
    "\n",
    "    data['rest_Revol'] = data['loanAmnt'] - data['revolBal']\n",
    "\n",
    "    data['dis_time'] = data['issueDate_year'] - (2020 - data['earliesCreditLine_year'])\n",
    "    for col in ['employmentTitle', 'grade', 'subGrade', 'regionCode', 'issueDate_month', 'postCode']:\n",
    "        data['{}_count'.format(col)] = data.groupby([col])['id'].transform('count')\n",
    "\n",
    "    return data\n",
    "\n",
    "\n",
    "def plotroc(train_y, train_pred, test_y, val_pred):\n",
    "    lw = 2\n",
    "    ##train\n",
    "    fpr, tpr, thresholds = roc_curve(train_y.values, train_pred, pos_label=1.0)\n",
    "    train_auc_value = roc_auc_score(train_y.values, train_pred)\n",
    "    ##valid\n",
    "    fpr, tpr, thresholds = roc_curve(test_y.values, val_pred, pos_label=1.0)\n",
    "    valid_auc_value = roc_auc_score(test_y.values, val_pred)\n",
    "\n",
    "    return train_auc_value, valid_auc_value\n",
    "\n",
    "\n",
    "def xgb_model(train, target, test, k):\n",
    "\n",
    "    saveFeature_list=list(train.columns)\n",
    "    feats = [f for f in saveFeature_list if f not in ['id', 'isDefault']]\n",
    "    feaNum = len(feats)\n",
    "    print('Current num of features:', len(feats))\n",
    "\n",
    "    seeds = [2020,666666,188888]\n",
    "    output_preds = 0\n",
    "    xgb_oof_probs = np.zeros(train.shape[0])\n",
    "\n",
    "    for seed in seeds:\n",
    "        folds = StratifiedKFold(n_splits=k, shuffle=True, random_state=seed)\n",
    "        oof_probs = np.zeros(train.shape[0])\n",
    "\n",
    "        offline_score = []\n",
    "        feature_importance_df = pd.DataFrame()\n",
    "        params = {'booster': 'gbtree',\n",
    "                  'objective': 'binary:logistic',\n",
    "                  'eval_metric': 'auc',\n",
    "                  'min_child_weight': 5,\n",
    "                  'max_depth': 8,\n",
    "                  'subsample': ss,\n",
    "                  'colsample_bytree': fs,\n",
    "                  'eta': 0.01,\n",
    "\n",
    "                  'seed': seed,\n",
    "                  'nthread': -1,\n",
    "\n",
    "                  'tree_method': 'gpu_hist'\n",
    "                  }\n",
    "        for i, (train_index, test_index) in enumerate(folds.split(train, target)):\n",
    "            \n",
    "            train_y, test_y = target[train_index], target[test_index]\n",
    "            train_X, test_X = train[feats].iloc[train_index, :], train[feats].iloc[test_index, :]\n",
    "            train_matrix = xgb.DMatrix(train_X, label=train_y, missing=np.nan)\n",
    "            valid_matrix = xgb.DMatrix(test_X, label=test_y, missing=np.nan)\n",
    "            test_matrix = xgb.DMatrix(test[feats], missing=np.nan)\n",
    "            watchlist = [(train_matrix, 'train'), (valid_matrix, 'eval')]\n",
    "            model = xgb.train(params, train_matrix, num_boost_round=100000, evals=watchlist, verbose_eval=100,\n",
    "                              early_stopping_rounds=600)\n",
    "            val_pred = model.predict(valid_matrix, ntree_limit=model.best_ntree_limit)\n",
    "            train_pred = model.predict(train_matrix, ntree_limit=model.best_ntree_limit)\n",
    "            xgb_oof_probs[test_index] += val_pred / len(seeds)\n",
    "            # oof_probs[test_index] += val_pred\n",
    "            test_pred = model.predict(test_matrix, ntree_limit=model.best_ntree_limit)\n",
    "\n",
    "            # 绘制roc曲线\n",
    "            train_auc_value, valid_auc_value = plotroc(train_y, train_pred, test_y, val_pred)\n",
    "            print('train_auc:{},valid_auc{}'.format(train_auc_value, valid_auc_value))\n",
    "            offline_score.append(valid_auc_value)\n",
    "            print(offline_score)\n",
    "            output_preds += test_pred / k / len(seeds)\n",
    "\n",
    "            fold_importance_df = pd.DataFrame()\n",
    "            fold_importance_df[\"Feature\"] = model.get_fscore().keys()\n",
    "            fold_importance_df[\"importance\"] = model.get_fscore().values()\n",
    "            fold_importance_df[\"fold\"] = i + 1\n",
    "\n",
    "            feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)\n",
    "\n",
    "        print('all_auc:', roc_auc_score(target.values, oof_probs))\n",
    "        print('OOF-MEAN-AUC:%.6f, OOF-STD-AUC:%.6f' % (np.mean(offline_score), np.std(offline_score)))\n",
    "        feature_sorted = feature_importance_df.groupby(['Feature'])['importance'].mean().sort_values(ascending=False)\n",
    "        feature_sorted.to_csv('../feature/xgb_importance.csv')\n",
    "        top_features = feature_sorted.index\n",
    "        print(feature_importance_df.groupby(['Feature'])['importance'].mean().sort_values(ascending=False).head(50))\n",
    "    return output_preds, xgb_oof_probs, np.mean(offline_score), feaNum\n",
    "\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    DATA_PATH = '../data/'\n",
    "    print('读取数据...')\n",
    "    data, train_label = data_preprocess(DATA_PATH=DATA_PATH)\n",
    "\n",
    "    print('开始特征工程...')\n",
    "    data = gen_basicFea(data)\n",
    "\n",
    "\n",
    "    print('data.shape', data.shape)\n",
    "    print('开始模型训练...')\n",
    "    train = data[~data['isDefault'].isnull()].copy()\n",
    "    target = train_label\n",
    "    test = data[data['isDefault'].isnull()].copy()\n",
    "\n",
    "    target_encode_cols = ['postCode', 'regionCode', 'homeOwnership', 'employmentTitle','title']\n",
    "\n",
    "    kflod_num = 5\n",
    "    ss = 0.8\n",
    "    fs = 0.4\n",
    "\n",
    "    class_list = ['postCode', 'regionCode', 'homeOwnership', 'employmentTitle','title']\n",
    "    MeanEnocodeFeature = class_list  # 声明需要平均数编码的特征\n",
    "    ME = MeanEncoder(MeanEnocodeFeature, target_type='classification')  # 声明平均数编码的类\n",
    "    train = ME.fit_transform(train, target)  # 对训练数据集的X和y进行拟合\n",
    "    # x_train_fav = ME.fit_transform(x_train,y_train_fav)#对训练数据集的X和y进行拟合\n",
    "    test = ME.transform(test)  # 对测试集进行编码\n",
    "    print('num0:mean_encode train.shape', train.shape, test.shape)\n",
    "\n",
    "    train, test = kfold_stats_feature(train, test, target_encode_cols, kflod_num)\n",
    "    print('num1:target_encode train.shape', train.shape, test.shape)\n",
    "    ### target encoding目标编码，回归场景相对来说做目标编码的选择更多，不仅可以做均值编码，还可以做标准差编码、中位数编码等\n",
    "    enc_cols = []\n",
    "    stats_default_dict = {\n",
    "        'max': train['isDefault'].max(),\n",
    "        'min': train['isDefault'].min(),\n",
    "        'median': train['isDefault'].median(),\n",
    "        'mean': train['isDefault'].mean(),\n",
    "        'sum': train['isDefault'].sum(),\n",
    "        'std': train['isDefault'].std(),\n",
    "        'skew': train['isDefault'].skew(),\n",
    "        'kurt': train['isDefault'].kurt(),\n",
    "    }\n",
    "    ### 暂且选择这三种编码\n",
    "    enc_stats = ['max', 'min', 'skew', 'std']\n",
    "    skf = KFold(n_splits=kflod_num, shuffle=True, random_state=6666)\n",
    "    for f in tqdm(['postCode', 'regionCode', 'homeOwnership', 'employmentTitle','title']):\n",
    "        enc_dict = {}\n",
    "        for stat in enc_stats:\n",
    "            enc_dict['{}_target_{}'.format(f, stat)] = stat\n",
    "            train['{}_target_{}'.format(f, stat)] = 0\n",
    "            test['{}_target_{}'.format(f, stat)] = 0\n",
    "            enc_cols.append('{}_target_{}'.format(f, stat))\n",
    "        for i, (trn_idx, val_idx) in enumerate(skf.split(train, target)):\n",
    "            trn_x, val_x = train.iloc[trn_idx].reset_index(drop=True), train.iloc[val_idx].reset_index(drop=True)\n",
    "            enc_df = trn_x.groupby(f, as_index=False)['isDefault'].agg(enc_dict)\n",
    "            val_x = val_x[[f]].merge(enc_df, on=f, how='left')\n",
    "            test_x = test[[f]].merge(enc_df, on=f, how='left')\n",
    "            for stat in enc_stats:\n",
    "                val_x['{}_target_{}'.format(f, stat)] = val_x['{}_target_{}'.format(f, stat)].fillna(\n",
    "                    stats_default_dict[stat])\n",
    "                test_x['{}_target_{}'.format(f, stat)] = test_x['{}_target_{}'.format(f, stat)].fillna(\n",
    "                    stats_default_dict[stat])\n",
    "                train.loc[val_idx, '{}_target_{}'.format(f, stat)] = val_x['{}_target_{}'.format(f, stat)].values\n",
    "                test['{}_target_{}'.format(f, stat)] += test_x['{}_target_{}'.format(f, stat)].values / skf.n_splits\n",
    "\n",
    "    print('num2:target_encode train.shape', train.shape, test.shape)\n",
    "\n",
    "    train.drop(['postCode', 'regionCode', 'homeOwnership', 'employmentTitle','title'], axis=1, inplace=True)\n",
    "    test.drop(['postCode', 'regionCode', 'homeOwnership', 'employmentTitle','title'], axis=1, inplace=True)\n",
    "    print('输入数据维度：', train.shape, test.shape)\n",
    "    \n",
    "    xgb_preds, xgb_oof, xgb_score, feaNum = xgb_model(train=train, target=target, test=test, k=kflod_num)\n",
    "\n",
    "    lgb_score = round(xgb_score, 5)\n",
    "    sub_df = test[['id']].copy()\n",
    "    sub_df['isDefault'] = xgb_preds\n",
    "    off = test[['id']].copy()\n",
    "    subVal_df = train[['id']].copy()\n",
    "    subVal_df['isDefault'] = xgb_oof\n",
    "    outpath = '../user_data/'\n",
    "\n",
    "    all_auc_score = roc_auc_score(train_label, subVal_df['isDefault'])\n",
    "    print('整体指标得分：', all_auc_score)\n",
    "    all_auc_score = round(all_auc_score, 5)\n",
    "\n",
    "    sub_df.to_csv(outpath+'xgb1.csv',index=False)\n",
    "    subVal_df.to_csv(outpath+'xgb1Val.csv',index=False)\n",
    "    # sub_df.to_csv(\n",
    "    #     outpath + str(all_auc_score) + '_' + str(feaNum) + '_' + nowtime + '_{}_{}_{}_xgb.csv'.format(ss, fs,\n",
    "    #                                                                                                   kflod_num),\n",
    "    #     index=False)\n",
    "    # subVal_df.to_csv(\n",
    "    #     outpath + str(all_auc_score) + '_' + str(feaNum) + '_' + nowtime + '_{}_{}_{}_subVal.csv'.format(ss, fs,\n",
    "    #                                                                                                      kflod_num),\n",
    "    #     index=False)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "uuid": "5e11ae06-11ac-4726-9d6b-7ecf48825a84"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 创建一个字典来存储数据\n",
    "data = {\n",
    "    'Feature': [\n",
    "        'dti', 'rest_Revol', 'n_feat_skew', 'revolUtil', 'issueDate_day',\n",
    "        'rest_money_rate', 'revolBal', 'earliesCreditLine_Allmonth', 'postCode_count',\n",
    "        'avg_income', 'total_income', 'rest_money', 'mean_interestRate', 'n_feat_std',\n",
    "        'postCode_pred_0', 'postCode_isDefault_kfold_mean', 'all_installment',\n",
    "        'annualIncome', 'interestRate', 'installment', 'postCode_target_skew',\n",
    "        'regionCode_pred_0', 'n_feat_mean', 'employmentTitle_count',\n",
    "        'employmentTitle_isDefault_kfold_mean', 'postCode_target_std',\n",
    "        'employmentTitle_pred_0', 'ficoRange_mean', 'regionCode_isDefault_kfold_mean',\n",
    "        'closeAcc', 'regionCode_target_skew', 'employmentTitle_target_skew',\n",
    "        'avg_loanAmnt', 'dis_time', 'loanAmnt', 'employmentTitle_target_std',\n",
    "        'totalAcc', 'n6', 'n_feat_sum', 'regionCode_count', 'postCode_pred_1',\n",
    "        'employmentTitle_pred_1', 'title_pred_0', 'title_isDefault_kfold_mean',\n",
    "        'earliesCreditLine_year', 'subGrade', 'title_target_skew', 'homeOwnership_pred_0',\n",
    "        'n8', 'title_target_std'\n",
    "    ],\n",
    "    'Value': [\n",
    "        15865.2, 14956.8, 14818.6, 14358.4, 14207.6,\n",
    "        14100.0, 13443.0, 13280.4, 12874.6, 12792.8,\n",
    "        12659.8, 12466.4, 11531.2, 11119.0, 10766.4,\n",
    "        10574.4, 10539.6, 10346.0, 10117.6, 9917.6,\n",
    "        9530.6, 9488.6, 9140.4, 9091.2, 9057.6,\n",
    "        9025.0, 8976.8, 8918.8, 8900.6, 8900.4,\n",
    "        8788.4, 8341.0, 8021.2, 7919.6, 7909.2,\n",
    "        7785.2, 7673.4, 7673.0, 7558.0, 7461.6,\n",
    "        7237.4, 6979.8, 6816.6, 6603.2, 6598.2,\n",
    "        6369.8, 6138.0, 6105.4, 6011.2, 5986.8\n",
    "    ]\n",
    "}\n",
    "\n",
    "# 将数据转换为 DataFrame\n",
    "df = pd.DataFrame(data)\n",
    "\n",
    "# 按值降序排列\n",
    "df = df.sort_values(by='Value', ascending=False)\n",
    "\n",
    "# 创建条形图\n",
    "plt.figure(figsize=(12, 8))\n",
    "plt.barh(df['Feature'], df['Value'], color='skyblue')\n",
    "plt.xlabel('Importance Value')\n",
    "plt.title('Feature Importance Visualization')\n",
    "plt.gca().invert_yaxis()  # 反转 Y 轴，使得重要性高的特征在上\n",
    "plt.grid(axis='x')\n",
    "\n",
    "# 显示图形\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
